#include <stdio.h>
#include <stdbool.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "main.h"
#include <unistd.h>
#include <limits.h>
#include <dirent.h>
#include "esp_camera.h"

#define TAG "main"

static QueueHandle_t gpio_evt_queue = NULL; // 定义队列句柄

// GPIO中断服务函数
static void IRAM_ATTR gpio_isr_handler(void *arg)
{
    uint32_t gpio_num = (uint32_t)arg;                  // 获取入口参数
    xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL); // 把入口参数值发送到队列
}

// GPIO任务函数
static void gpio_task_example(void *arg)
{
    uint32_t io_num; // 定义变量 表示哪个GPIO
    for (;;)
    {
        if (xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY))
        {                                                                                // 死等队列消息
            printf("GPIO[%" PRIu32 "] intr, val: %d\n", io_num, gpio_get_level(io_num)); // 打印相关内容
        }
    }
}

void btn_init(void)
{
    gpio_config_t io0_conf = {
        .intr_type = GPIO_INTR_NEGEDGE,         // 下降沿中断
        .mode = GPIO_MODE_INPUT,                // 输入模式
        .pin_bit_mask = 1 << CONFIG_BUTTON_PIN, // 选择GPIO0
        .pull_down_en = 0,                      // 禁能内部下拉
        .pull_up_en = 1                         // 使能内部上拉
    };
    // 根据上面的配置 设置GPIO
    gpio_config(&io0_conf);

    // 创建一个队列处理GPIO事件
    gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t));
    // 开启GPIO任务
    xTaskCreate(gpio_task_example, "gpio_task_example", 2048, NULL, 10, NULL);
    // 创建GPIO中断服务
    gpio_install_isr_service(0);
    // 给GPIO0添加中断处理
    gpio_isr_handler_add(CONFIG_BUTTON_PIN, gpio_isr_handler, (void *)CONFIG_BUTTON_PIN);
}

void app_main(void)
{
    ESP_LOGI(TAG, "Hello world!");
    btn_init();
    /* iic device */
    iic_init();
    qmi8658_init();
    pca9557_init();
    /* lcd device */
    lcd_init();
    /* sd card */
    sd_init();
    /* usb */
    // usb_init();
    bsp_camera_init();
    // app init
    // app_screen_init();

    // 等待LVGL初始化完成
    vTaskDelay(pdMS_TO_TICKS(1000));

    // 使用LVGL显示摄像头图像

    // app_downalder_init();

    // /* shell */
    // userShellInit();
    //  while(1)
    //  {
    //      ESP_LOGI(TAG, "hello world!");
    //      vTaskDelay(2 / portTICK_PERIOD_MS);
    //  }
}
